package com.indra.bbva.pe.monitor.in.controller;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.indra.bbva.pe.monitor.in.bo.iface.VerificacionConsultaBOIface;
import com.indra.bbva.pe.monitor.in.utils.Util;

@Controller(value="verificacionConsultaController")
@RequestScoped
public class VerificacionConsultaController extends GenericoController{
	private static final Logger log = Logger.getLogger(VerificacionConsultaController.class);
	
	@Autowired
	private VerificacionConsultaBOIface verificacionConsultaBOIface;
	
	private String tipoConsulta;
	private String consulta;
	private List<String> listaCabecera;
	private List<Object[]> listaDetalle;
	
	public void onPageLoad(ComponentSystemEvent event) {
		try{
			if (!FacesContext.getCurrentInstance().isPostback()) {
				System.out.println("VerificacionConsultaController... is not Postback");
				
				tipoConsulta = "";
				consulta = "";
				listaCabecera=new ArrayList<String>();
				listaDetalle= new ArrayList<Object[]>();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	public void ejecutarConsulta(){
		listaCabecera=new ArrayList<String>();
		listaDetalle= new ArrayList<Object[]>();	
		List<Map<String, Object>> rows;
		Map<String,Object> mapResult;
		Set<Map.Entry<String,Object>> setMap=null;
		Iterator<Map.Entry<String,Object>> ite=null;
		Map.Entry<String,Object> entry =null;
		
		Map<String,Object> mapr=null; 
		Set<Map.Entry<String,Object>> setDetalle=null;
		try {
			if(consulta!=null && consulta.trim().length() > 0){
				consulta = consulta.trim();
				if(tipoConsulta.equals("1") && consulta.trim().contains(";") ){
					int contador=0;
					String[] oLista= consulta.trim().split(";");
					for (String fila : oLista) {
						rows = verificacionConsultaBOIface.ejecutarConsulta(tipoConsulta, fila);
						if(rows.size()>0){
							mapResult = rows.get(0);    	 	
							setMap = mapResult.entrySet();
							ite = setMap.iterator();
							if(contador==0){
								while(ite.hasNext()){	    			
									entry = ite.next();    			
									listaCabecera.add(entry.getKey()+"");
								}							
							}
					    	for(int i=0;i<rows.size();i++){
					    		mapr = rows.get(i);	    		
					    		setDetalle = mapr.entrySet();	    			    		
					    		listaDetalle.add(clearKey(setDetalle.toArray()));	    		
					    	}	
						}
						contador++;
					}
				}else{
					if(consulta.endsWith(";")){
						if(consulta.length() == 1){
							mostrarWarning("Escriba la consulta a ejecutar");
							return;
						}
						consulta = consulta.substring(0,consulta.length()-1);
					}
					rows = verificacionConsultaBOIface.ejecutarConsulta(tipoConsulta, consulta.trim());
					if(rows.size()>0){
						mapResult = rows.get(0);    		
						setMap = mapResult.entrySet();
						ite = setMap.iterator();	    		
						while(ite.hasNext()){	    			
							entry = ite.next();    			
							listaCabecera.add(entry.getKey()+"");
						}			    	
				    	for(int i=0;i<rows.size();i++){
				    		mapr = rows.get(i);	    		
				    		setDetalle = mapr.entrySet();	    			    		
				    		listaDetalle.add(clearKey(setDetalle.toArray()));	    		
				    	}
					}
				}
			}else{
				mostrarWarning("Escriba la consulta a ejecutar");
			}
		}catch(Exception ex){
			log.error("Error interno.", ex);
			mostrarError("Error interno. "+Util.obtenerMensajeError(ex));
		}	
	}
	
	private Object[] clearKey(Object[] objects){
		int ind;
		Object[] res=new Object[objects.length];
		for(int i=0;i<objects.length;i++){
			ind=objects[i].toString().lastIndexOf("=");
			res[i]=objects[i].toString().substring(ind+1);
		}
		return res;
	}
	
	public String getConsulta() {
		return consulta;
	}

	public void setConsulta(String consulta) {
		this.consulta = consulta;
	}

	public String getTipoConsulta() {
		return tipoConsulta;
	}

	public void setTipoConsulta(String tipoConsulta) {
		this.tipoConsulta = tipoConsulta;
	}

	public List<String> getListaCabecera() {
		return listaCabecera;
	}

	public void setListaCabecera(List<String> listaCabecera) {
		this.listaCabecera = listaCabecera;
	}

	public List<Object[]> getListaDetalle() {
		return listaDetalle;
	}

	public void setListaDetalle(List<Object[]> listaDetalle) {
		this.listaDetalle = listaDetalle;
	}
}
